# -*- coding: utf-8 -*-
"""
Created on Sun Apr 12 02:51:08 2020
        华为联盟数据统计工具
使用方法：
    例如：您的联盟url是“ https://developer.huaweicloud.com/hero/group-1111.html”
          其中 1111 就是您的联盟id
    双击 “dist” 目录下的 “采集工具2.0” 后输入您的“联盟id”回车
@author: daixiaolong
"""

#import sys
import os
import requests
from lxml import etree
import prettytable as pt
#import json
import datetime

"""
现有功能：
    统计联盟数据{成员总数、发帖总数、回帖总数、浏览总数}
未实现：
    按月：存储数据：联盟信息{成员数、发帖量、回帖量、浏览量}
"""


def getlminfo(url,sumLook=0,sumReply=0):
    #获取联盟信息{人数、发帖量、回帖量、浏览量}
    #这里的sumlook
    req = requests.get(url)
    tree=etree.HTML(req.text)
    
    lminfo={
        #联盟名
        "unScNa":tree.xpath('//div[@class="unRCbox"]/div/h1/text()')[0],
        #联盟简介
        "unScIn":tree.xpath('//div[@class="unRCbox"]/div/p/text()')[0],
        #成员数
        "unScDet":int(tree.xpath('//div[@class="unScDet"]/text()')[0][3:]),
        #话题数
        "unGap":int(tree.xpath('//div[@class="unScDet"]/text()')[1][3:]),
        #总浏览量，总回复量
        "sumLook":sumLook,"sumReply":sumReply
        }
    return lminfo


def getpagitems(url,sumLook=0,sumReply=0):
    #获取文章列表
    #获取当页源码
    tree = etree.HTML(requests.get(url).text)
    #标题
    titles=tree.xpath(' //*[@class="poTit"]/a/text()')
    #作者
    pname=tree.xpath('//a[@class="poPname"]/text()')
    #作者id
    pid=tree.xpath('//a[@class="poPname"]/@href')
    #发表日期
    time=tree.xpath('//span[@title]/@title | //span[@class="poPtime" and not(span)]/text()')
    #由于日期提取后自带“发表于”这三个字，所以写个循环删掉
    for t in range(len(time)):
        time[t]=time[t][3:]
    #链接
    hrefs=tree.xpath('//*[@class="poTit"]/a/@href')
    #浏览量
    looks=tree.xpath('//a[@class="poLook"]/p/text()')
    #回复量
    replys=tree.xpath('//a[@class="poReply"]/p/text()')
    
    itmes=[]
    for i in range(len(titles)):
        sumLook += int(looks[i][1:])
        sumReply += int(replys[i][1:])
        itmes.append({"title":titles[i],    #标题
                      "href":hrefs[i],      #链接
                      "pname":pname[i],     #作者
                      "pid":pid[i],         #作者id
                      "time":time[i],
                      "look":looks[i][1:],  #浏览量
                      "reply":replys[i][1:] #回复量
                      })
    
    #返回{当前网页帖子列表，总浏览量，总回复量}
    return [itmes,sumLook,sumReply]

def getpags(url):
    #获取分页数据
    tree = etree.HTML(requests.get(url).text)
    tree.xpath('//a[@class="newpage"]/@href')
    return [url]+tree.xpath('//a[@class="newpage"]/@href')

def getitmes(url,sumLook=0,sumReply=0):
    #循环爬取分页数据
    itmes=[]
    for purl in getpags(url):
        pitmes=getpagitems(purl)
        itmes.extend(pitmes[0])
        sumLook+=pitmes[1]
        sumReply+=pitmes[2]
    return [itmes,sumLook,sumReply]


def itmes_tab(data):
    #将帖子列表数据格式化为表格
    tb1=pt.PrettyTable(["联盟名","简介","成员数","话题数","总浏览量","总回复量"])
    tb1.add_row([lminfo["unScNa"],
                 lminfo["unScIn"],
                 lminfo["unScDet"],
                 lminfo["unGap"],
                 lminfo["sumLook"],
                 lminfo["sumReply"]
                 ])
    return tb1

def lminfo_tab(data):
    #将联盟信息格式化为表格
    tb2=pt.PrettyTable(["标题","链接","作者","发表日期","浏览量","回复"])
    tb2.align["标题"]="l"
    tb2.align["浏览量"]="r"
    for i in range(len(sumitmes[0])):
        tb2.add_row([sumitmes[0][i]["title"],
                    sumitmes[0][i]["href"],
                    sumitmes[0][i]["pname"],
                    sumitmes[0][i]["time"],
                    sumitmes[0][i]["look"],
                    sumitmes[0][i]["reply"]])
    return tb2

if  __name__ == "__main__":
    #获取用户输入联盟id
    heroid=input("请输入联盟id：")
    #设置基础url，用来拼接完整url
    baseurl="https://developer.huaweicloud.com/hero/"
    url=baseurl+"group-"+str(heroid)+".html"

    #获取帖子列表，传入{url}
    sumitmes=getitmes(url)
    #获取联盟信息传入{url，总浏览量，总回帖量}
    lminfo=getlminfo(url,sumitmes[1],sumitmes[2])
    
    #将数据传入表格格式化函数
    print(lminfo_tab(lminfo))
    print(itmes_tab(sumitmes))
    
nowdate=datetime.datetime.now()
#获取年月，因为是按月统计所以日暂时用不着
mytime=nowdate.strftime("%Y")+"年"+nowdate.strftime("%m")+"月"


if input("是否保存数据为html？[y/n]:") == "y":
    style='<style type="text/css">table{width:90%;background:#ccc;margin:10px auto;border-collapse:collapse;}th,td{height:25px;line-height:25px;text-align:center;border:1px solid #ccc;}th{background:#eee;font-weight:normal;}tr{background:#fff;}tr:hover{background:#cc0;}td a{color:#06f;text-decoration:none;}td a:hover{color:#06f;text-decoration:underline;}</style>\n'
    htmlfile=mytime+lminfo["unScNa"]+".html"
    htmlbody= style + itmes_tab(sumitmes).get_html_string()+lminfo_tab(lminfo).get_html_string()
    f = open(htmlfile,"w",encoding='utf-8')
    f.write(htmlbody)
    f.close()
    print("保存成功!文件名：",htmlfile,"您可以在本程序的同级目录找到保存的网页")
    #打开网页文件
    os.system(htmlfile)

#防止数据打印完后窗口消失
print("\n\n\n")
print("开源地址：https://gitee.com/1091198228/huaweilianmengshujucaiji")
#防止数据打印完后窗口消失
input("程序结束,感谢使用")

